#ifndef BALLOT_GENERATOR_H
#define BALLOT_GENERATOR_H

#include <QtCore>
#include <QtSql>

#include <cryptopp/rsa.h>
#include <cryptopp/osrng.h>
#include <cryptopp/files.h>
#include <cryptopp/hex.h>
#include <cryptopp/pssr.h>
#include <cryptopp/hmac.h>
#include <pvid_authority.h>

#include <string>

using namespace std;
using namespace CryptoPP;

struct Propuesta{
    QString num_prop;
    QString sub_prop;
    QString desc_prop;
    QString tipo_voto;
    QString opc1_desc;
    QString opc2_desc;
    QString opc3_desc;
    QString opc4_desc;
    QString opc5_desc;
    QString misc;
    };


class ballot_generator
{
public:
// Variables
    QDir obj_Dir;
    Propuesta prop;
    PVID_Authority *pvid;

// Funciones

    ballot_generator();
    ballot_generator(QString Dir);
    ballot_generator(QString Dir, bool no_key);

    ~ballot_generator();

    QString encryptMsg(QString Data,QString keyname);
    bool decryptMsg(QString &Data, QString &decryptedMsg);
    QString signMsg(QString &msg);
    bool verifyMsg(QString msg,QString keyToUse, QString &verifiedMsg);

    QString Hash(QString data1, QString data2);

    void SubBallotList();
    bool M1(QString &m1, QString &m2);
    bool M4(QString &m4, QString &m5);
    bool Search_in_BGBB(QString Hash);
    bool Key2Hex(QString keyname,QString &keyHex);

private:
//Variables
    AutoSeededRandomPool rng;
    QString PVID;
    QString es;

//Funciones
    void create_key();

    void Save(QString &filename, const BufferedTransformation& bt);
    void SavePrivateKey(QString &filename, const PrivateKey& key);
    void SavePublicKey(QString &filename, const PublicKey& key);

    void Load(QString filename, BufferedTransformation& bt);
    void LoadPrivateKey(QString filename, PrivateKey& key);
    void LoadPublicKey(QString filename, PublicKey& key);

    QString shift_String(QString &msg);
    QString shift_String(QString &msg,int max);

    bool Hex2Key(QString keydata, QString keyname);

    void generate_ballot(QString &Ballot);
    bool Save_Hash(QString B,QString VoterKey);
    bool Save_in_BL(QString PVID, QString M3, QString B, QString es);
    //bool PVID_verification(QString PVID);

};

#endif // BALLOT_GENERATOR_H
